home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / tracker_3_19.lzh / tracker / sgi_audio.c < prev    next >
C/C++ Source or Header  |  1993-11-11  |  4KB  |  170 lines

  1. /* sgi_audio.c */
  2.  
  3. /* $Id: sgi_audio.c,v 3.7 1993/11/11 20:00:03 espie Exp espie $
  4.  * $Log: sgi_audio.c,v $
  5.  * Revision 3.7  1993/11/11  20:00:03  espie
  6.  * Amiga support.
  7.  *
  8.  * Revision 3.6  1993/07/14  16:33:41  espie
  9.  * Added stuff.
  10.  *
  11.  * Revision 3.5  1993/05/09  14:06:03  espie
  12.  * Corrected mix problem.
  13.  *
  14.  * Revision 3.4  1992/11/27  10:29:00  espie
  15.  * General cleanup
  16.  *
  17.  * Revision 3.3  1992/11/24  10:51:19  espie
  18.  * Added pseudo discardbuffer.
  19.  *
  20.  * Revision 3.2  1992/11/22  17:20:01  espie
  21.  * Checks for finetune ?
  22.  *
  23.  * Revision 3.1  1992/11/19  20:44:47  espie
  24.  * Protracker commands.
  25.  *
  26.  * Revision 3.0  1992/11/18  16:08:05  espie
  27.  * New release.
  28.  *
  29.  * Revision 2.11  1992/11/17  15:38:00  espie
  30.  * Dummy discard_buffer()
  31.  * Changed sync_audio value again.
  32.  * Added synchro for dump.
  33.  * Bug fix: must ask new frequency after we tried to set it to get it
  34.  * rounded up.
  35.  * Added stereo option (kind of).
  36.  * Separated mix/stereo stuff.
  37.  * Checked buffer size.
  38.  * Added possibility to get back to MONO for the sgi.
  39.  * Added stereo capabilities to the indigo version.
  40.  * Ask the frequency to the audio device.
  41.  * Corrected bug: when closing audio,
  42.  * we now wait for the samples queue to be empty.
  43.  */
  44.  
  45. #include <audio.h>
  46. #include <malloc.h>
  47. #include <stdio.h>
  48. #include "defs.h"
  49. #include "extern.h"
  50.  
  51. XT int sginap(long ticks);
  52.      
  53. LOCAL char *id = "$Id: sgi_audio.c,v 3.7 1993/11/11 20:00:03 espie Exp espie $";
  54.  
  55. LOCAL signed short *buffer;
  56. LOCAL int index;
  57.  
  58. LOCAL int number;
  59. LOCAL BOOL sync = FALSE;
  60.  
  61. LOCAL ALport audio;
  62. LOCAL ALconfig config;
  63.  
  64. LOCAL BOOL donotwait = FALSE;
  65. LOCAL long chpars[] = {AL_OUTPUT_RATE, 0};
  66.  
  67. LOCAL int stereo;  /* are we playing stereo or not ? */
  68. /* 256th of primary/secondary source for that side. */
  69. LOCAL int primary, secondary;
  70.  
  71. void set_mix(percent)
  72. int percent;
  73.     {
  74.     percent *= 256;
  75.     percent /= 100;
  76.     primary = percent;
  77.     secondary = 512 - percent;
  78.     }
  79.  
  80. int open_audio(f, s)
  81. int f, s;
  82.     {
  83.  
  84.     donotwait = FALSE;
  85.     chpars[1] = f;
  86.     if (f != 0)
  87.         ALsetparams(AL_DEFAULT_DEVICE, chpars, 2);
  88.     ALgetparams(AL_DEFAULT_DEVICE, chpars, 2);
  89.     config = ALnewconfig();
  90.     stereo = s;
  91.     if (stereo)
  92.         {
  93.         ALsetchannels(config, AL_STEREO);
  94.         number = 2;
  95.         }
  96.     else
  97.         {
  98.         ALsetchannels(config, AL_MONO);
  99.         number = 1;
  100.         }
  101.     ALsetwidth(config, AL_SAMPLE_16);
  102.     audio = ALopenport("soundtracker mono", "w", config);
  103.     index = 0;
  104.     buffer = malloc(sizeof(signed short) * number * chpars[1]);
  105.     return chpars[1];
  106.     }
  107.  
  108. void set_synchro(s)
  109. BOOL s;
  110.     {
  111.     sync = s;
  112.     }
  113.  
  114. int update_frequency()
  115.     {
  116.     int oldfreq;
  117.  
  118.     oldfreq = chpars[1];
  119.     ALgetparams(AL_DEFAULT_DEVICE, chpars, 2);
  120.     if (chpars[1] != oldfreq)
  121.         {
  122.         buffer = realloc(buffer, sizeof(signed short) * number * chpars[1]);
  123.         return chpars[1];
  124.         }
  125.     else
  126.         return 0;
  127.     }
  128.  
  129.  
  130. void output_samples(int left, int right)
  131.     {
  132.     if (stereo)
  133.         {
  134.         buffer[index++] = (left * primary + right * secondary)/256;
  135.         buffer[index++] = (right * primary + left * secondary)/256;
  136.         }
  137.     else
  138.         buffer[index++] = left + right;
  139.     }
  140.  
  141. void flush_buffer(void)
  142.     {
  143.     ALwritesamps(audio, buffer, index);
  144.     if (sync)
  145.         while(ALgetfilled(audio) > index * 10)
  146.             /* busy wait */
  147.             ;
  148.     index = 0;
  149.     }
  150.  
  151. void discard_buffer(void)
  152.     {
  153.     donotwait = TRUE;
  154.     /* mostly not implemented, only working when using close_audio
  155.      * right after
  156.      */
  157.     }
  158.  
  159. void close_audio(void)
  160.     {
  161.     if (!donotwait)
  162.         {
  163.         while(ALgetfilled(audio) != 0)
  164.             sginap(1);
  165.         }
  166.     ALcloseport(audio);
  167.     ALfreeconfig(config);
  168.     free(buffer);
  169.     }
  170.